GAME−MZコンパイラ ――――――――――――――――――――――――――――――――――――――― アスキー 1979年10月号掲載 MZ−80K/C ソース    $1200−$273A オブジェクト $3B00−$5FFF S:$3B00        $6000−$7CFD S:$6000 ――――――――――――――――――――――――――――――――――――――― 詳しい説明は7月号に出ていますので省略します。 今回は他機種用に発表されたプログラムを 自分のシステム用に書き替えをする場合の参考となる様に 大巾な書き替えはしていませんので 7月号のリストと比較してみて下さい。 サブルーチンの中には使用しているレジスタの違うものもありますので 一応表の中に違いのあるもののみ説明を加えました。 今回のCOMPILERは拡張機能のうち ページジャンプ機能については考慮に入れていません。 またSAVEについてはコンパイルしたものが 機械語の為新たに改良して加えました。 RAMが標準の方はコンパイラのプログラムを $3B00から落とすとちょうどGAMEインタプリタとつながります。 この場合のワークエリアは$3000で充分です。 コンパイルしたものをGAMEのサブルーチン($5E00)で ロードした場合は、その直後なら、>==で走ります。 ・−−−−−−−−−−−−−−−−−・ |       問題点       | ・−−−−−−−−−−−−−−−−−・ a.計算型GOT0、GOSUB文は使えない。(改善は大変困難) b.変数領域、サブルーチン群はすべてGAMEを使用している。(改善可能) c.GAMEで使用可能な変数がすべて使用可能な訳ではない。(改善容易) d.メモリ効率が非常に悪い。コンパイルしたものの方がメモリをくっている。   (改善可能) 上記のうちaについてはあきらめた方がよいと思います。 ・−−−−−−−−−−−−−−−−−・ |      今後の改良      | ・−−−−−−−−−−−−−−−−−・ 中島氏があげておられる 80の命令については実はZ80にもあてはまる為、 少々横着な方法かも知れませんが、 次のような提案をしたいと思います。 絶対アドレスを含んだサブルーチンパッケージを ひとまず作りましょう。 コンパイルする場合の先頭アドレスをSとすると 必要なサブルーチンは S+nの形で呼べばよい訳ですし、 絶対アドレスで書かれていてもSさえ決まってしまえば 書き替えに必要なアドレスはすべて決まってしまうことになります。 そう考えれば多少手間はかかっても 80で充分可能であると思うのですが いかがでしょうか。 実は私はこの考えで 独立性のあるものを作りたいと思っています。 また一応SPについてはモニタと同じにし JOB打ち切りでモニタにもどるよう設計すればよいと思います。 (図1参考図参照) 出来ればGAMEインタプリタの中で サブルーチンパッケージとしリロケートして 集めて置くとよいと思います。 また変数域についてはSの前80Hバイトをとった方が 最初にアドレスが決まってしまい都合がよいのですが 良策とは言えないでしょう。 言うまでもない事ですが、 テープにはSからEまでをSAVEすればよい訳です。 ・−−−−−−−−−−−−−−−−−−−−−−・ |                      | |     ・――――・           | |     |JMP MAIN|           | |    S|――――――――――――・   | |     |サブルーチン      |   | |     |パッケージ       |   | | MAIN|――――――――――――|   | |     |機械語         |   | |     |プログラム       |   | |    E|――――――――――――|   | |     |変数領域(80Hバイト)|   | |     |            |   | |    &|――――――――――――|   | |     |配列用         |   | |                      | | 図1 コンパイラ改造についての参考図   | ・−−−−−−−−−−−−−−−−−−−−−−・ ・−−−−−−−−−−−−−−−−−・ |       あとがき      | ・−−−−−−−−−−−−−−−−−・ いかがでしたでしょうか。 図やリストが多く大変だと思いましたので 詳しいことはすべて省略しました。 GAME−MZ、COMPILERと 大変急がしい思いをされた方もみえると思います。 私自身、ASCII誌の編集者の皆さんが親切で 毎号同じことを説明してくれないと頭の中へはいりません。 わからないことは該当号を引っぱり出し、 よく読んでから次に進むようにしています。 ですから出来ればこれらのプログラムについても 昨年7月号あたりのGAME IIIの記事からじっくこと 順を追って理解を深めて欲しいと思います。 そしてさらに良いものを どんどん発表して行っていただきたいと思います。 ・−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−・ |サブルーチン |GAME80 GAME-MZ|    留意点    | コンパイラ留意点 | |−−−−−−+−−−−−−−+−−−−−−−−−−−+−−−−−−−−−−| |CR/LF  | 8C83 090E | |220でプログラム末に | |SPC | 8B58 5BDB | |行番号(32767)が | |1 CHROUT | 8B85 5BF3 | |あるものとして判断 | |PRINT | FA52 5CF6 |HLで示されるアドレスから |しています。 | | | |Bレジスタと同じ内容の  |これは必ず必要な処理| | | |アドレスの前までを印字し |ですので行番号 | | | |00Hでもどる。 |として32767は使用 | | | |BREAK判別もする。 |できません。 変数の| |PRINTLEFT | 8C26 5C8C | |アクセス及び冗長形の | |HEX OUT1 | 8C32 5C93 | |スキップの判定は | |HEX OUT | - 5C90 |DEレジスタペアの内容を |インタプリタ内め方法に | | | |16進4桁で印字。 |あわせた方が、 | |PRINT RIGHT | 8B9C 5C4E |Accのケタ数で右づめ印字。|よいと思います。(410,| |SUB     | 8A03 5983 |CARRY=0でなければ |4040〜4060,5000 | | | |ならない。 |,5720)5150,5330では | |MULT | 8A0F 598C | |実際インタプリタ内で | |DIV | 8A2C 59A8 | |この通りの処理を | |AND | - 59EF | |していますが、使用 | |OR | - 59FA | |不可能ですので、改良 | |XOR | - 5A05 | |しエラーが出るように | |RND | 889E 5AAD | |しました。 | |1 CHRIN | 8C96 5D83 |Eレジスタに |5650は不必要ですので| | | |結果がはいる。 |削除しました。 | |NEGATE | 8A5B 59C8 | |5550〜5780はFOR NEXT| |ABS | 8872 5A81 | |,DO UNTILの処理です。| |NOT | 8881 5A8E | |是非、御解読下さい。 | |INPUT | 8904 5AFD | | | |HOT START | 8603 5886 | | | |SET RND | 8D52 5F4E | | | |MODULO | 8D4E 5F4A | | | |GET CHRIN | - 5F36 | | | |V,TABLE | 8D06 5F02 | | | |BREAK | - 58F2 |GETについても同様。 | | ・−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−・ 表1 GAME80とGAME−MZのアドレス対応表     GAME80とGAME-MZとではアドレスの他、一部使用レジスタに     差がありますので注意が必要です。       コンパイラの         使い方 ――――――――――――――――――― コンパイラをきちんと打ち込むと、 先頭ポインタ「=」は$1200、 ENDポインタ「&」は$273Aになっているはずです。 これをインタプリタによって走らせ、 まずは自分自身をコンパイル(機械語プログラムに変換)します (その前に>=$5DD0でテープにセーブしておきましょう)。 #=1で走らせ(インタプリタモード) 各々のアドレスをインプットします。 16進数の前には$マークを忘れないでください。 3つの数値を入れるとコンパイルが始まります。 インタプリタモードですのでかなり時間がかかります。 エラーが起きたらそこを直してもう一回。 正常に終了したらプログラムサイズをチェックし、 問題なければセーブしておきまし 次からはこのテープによりマシン語化された 高速コンパイラを利用することができます。 (GAMEからは>=$3B00、 ROMモ二夕からはGOTO$3B00) ただしインタプリタが存在しないと使えませんので注意してください。 ・−−−−−−−−−−−−−−−−−・ |READY | |??== | |1200 | |READY | |??=& | |273A | |READY | |#=1 | |GAME FROM?$1200 | |START ?$3B00 | |MORK AREA?$3000 | |         | | 10 3B00 1200 | | 20 3B00 1219 | | 30 3B20 122D | | 40 3B40 1241 | | 50 3B65 1257 | | 60 3B84 1266 | | 70 3BB2 1287 | ・−−−−−−−−−−−−−−−−−・ コンパイル開始時の画面 ・−−−−−−−−−−−−−−−−−・ |# 7050 5757 26D1   | | 7060 57B5 26FE 5886  | | 20000 57E6 272A 5886  | |           | |PROGRAM SIZE=$1CFE($3B00-$57FD) | |           | |ALL END          | |           | |SAVE (Y OR N)?Y         | |FROM?$3B00 TO?$5EFF      | |NAME?GAME-MZ COMPILER   | |↓RECORD.PLAY         | |WRITING GAME-MZ COMPILER  | |PLEASE VERIFY:>=$5E20       | |READY           | |>=$5E20          | |↓PLAY         | |FOUND GAME-MZ COMPILER | |READY | ・−−−−−−−−−−−−−−−−−・ コンパイル正常終了の画面